#pragma once
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <set>
#include <fstream>
#include <sstream>
#include <regex>
#include <queue>

using namespace std;
// 四元式
class Quadruple {
public:
    string op;
    string arg1;
    string arg2;
    string result;
    int label;
    Quadruple() = default;
    Quadruple(string op, string arg1, string arg2, string result);
};
// DAG节点
class DAGNode
{
public:
    static int next_id;
    int id;				//	编号
    int odeg;			//  出度
    string op;			//  操作符
    vector<string>	var_names;	// 变量名列表
    string key_var;				// 使用的变量名
    DAGNode* left;				// 左子树
    DAGNode* right;				// 右子树
    DAGNode(string op_val, string val, DAGNode* l = nullptr, DAGNode* r = nullptr);
    void add_var(string var);
    void set_key_var();
    void remove_var(string var);
};

// DAG优化类
class DAGOptimizer {
public:
    vector<DAGNode*> nodes;
    //map<string, DAGNode*> var_to_node;
    //map<string, string> const_mark;
    map<string, int> varMap;
    void generateDAG(vector<Quadruple> quat);
    DAGOptimizer(vector<Quadruple> quat);
    int find_var(string var);
    int find_parent(int index1, int index2, string op);
    vector<DAGNode*> find_parent_dec(DAGNode* node);
    vector<string> find_by_int(int i);
    void updateVar(int index,string var);
    bool is_func_entry = false;
};


// DAG
class DAG {
public:
    vector<DAGOptimizer> dags;
    vector<Quadruple> olds;
    vector<Quadruple> news;
    bool readFromFile(string fileName);
    bool parseQuadruple(string& line, Quadruple& quad);
    DAG();
    DAG(vector<Quadruple> quat);
    // 划分基本块
    vector<int> leaders;	// 入口
    void findLeaders();
    void generateDAGOptimizer();
    void generateNewQuad();
    bool wirte2File();
};

